#ifndef ARCHIVO_H_
#define ARCHIVO_H_

#include "ArbolBMas.h"
#include "Registro.h"
#include <string>

/*
 * TAM_MAX_PALABRA define la longitud maxima de la clave que se inserta en
 * el indice. Si una palabra excede esa longitud, se toman los TAM_MAX_PALABRA
 * primeros caracteres para usarlos de clave y los restantes caracteres se
 * guardan en un archivo stream. Para las palabras cuyos primeros
 * TAM_MAX_PALABRA caracteres coinciden, se encadenan entre si. La siguiente 
 * informacion se guarda por cada entrada del archivo stream:
 * 		* longitud de los caracteres que exceden TAM_MAX_PALABRA
 * 		* los caracteres que exceden TAM_MAX_PALABRA (campo variable)
 * 		* id de la palabra
 * 		* offset de la siguiente palabra cuyos primeros TAM_MAX_PALABRA
 * 		caracteres coinciden. El final de la cadena contiene 0 en este campo.
 */
#define TAM_MAX_PALABRA 10

#define CLAVE "str"
#define DATO "num"

using namespace std;

/*
 * Clase que define la clave del indice
 */
class ClaveStr : public Registro
{
public:
	ClaveStr(const string& str="")
	{
		(*this)[CLAVE] = Campo(str.c_str(),TAM_MAX_PALABRA);
	}
};

/*
 * Clase que define el dato del indice
 */
class DatoLong : public Registro
{
public:
	DatoLong(long num=0)
	{
		(*this)[DATO] = (long) num;
	}
	long getDato(){return *((long*) ((*this)[DATO].getValor()));}
};

/*
 * 
 */
class ArchivoPalabras
{
	
private:
	
	ArbolBMas<ClaveStr,DatoLong> indice;
	fstream arch;
	long cantPalabras;
	
public:
	
	ArchivoPalabras(string ruta);
	~ArchivoPalabras();
	/*
	 * Agrega una palabra al archivo, devuelve el id de la misma
	 */
	long agregarPalabra(string& palabra);
	/*
	 * Devuelve el id de la palabra pasada como parametro
	 */
	long obtenerIdPalabra(string& palabra);
	/*
	 * Devuelve la cantidad total de palabras
	 */
	long obtenerCantidadPalabras(){return cantPalabras;}
	
};


#endif /*ARCHIVO_H_*/
